[mysqld]
server-id = {{ ansible_default_ipv4.address.split('.')[3] }}

# These are commonly set, remove the # and set as required.
datadir = {{ data_dir }}
port = 3306
socket=/tmp/mysql.sock

character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'

default-storage-engine = InnoDB


#MySQL实现区分大小写 1:不区分 0:区分
lower_case_table_names=1

# 设置group_concat最大长度
group_concat_max_len = 102400

#replicate-ignore-db     = mysql
#replicate-ignore-db     = information_schema
#replicate-ignore-db     = performance_schema

expire_logs_days        = 30
log_slave_updates       = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
skip-slave-start

# 允许的同时客户的数量
max_connections = 6000


# max_connect_errors是一个MySQL中与安全有关的计数器值，它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。
# max_connect_errors的值与性能并无太大关系。
max_connect_errors      = 800

# 一个查询语句包的最大尺寸,信息交换中使用信息包的允许大小(如：导入表)
# 设置在网络传输中一次消息传输量的最大值。系统默认值 为1MB，最大值是1GB，必须设置1024的倍数。
max_allowed_packet = 1073741824

# 服务器关闭非交互连接之前等待活动的秒数。
# 在线程启动时，根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值，取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。
# 参数默认值：28800秒（8小时）
wait_timeout = 86400

# 参数含义：服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
# 参数默认值：28800秒（8小时）
interactive-timeout = 86400

# 监听队列中所能保持的连接数即保存了在MySQL连接管理器线程处理之前的连接。
# back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。
# 如果一个短时间内有很多连接，则需要增大该参数的值，来指定到来的TCP/IP连接的侦听队列的大小。
# 不同的操作系统在这个队列大小上有它自己的限制。试图设定back_log高于你的操作系统的限制将是无效的。
# 默认值为50。对于Linux系统推荐设置为小于512的整数。系统值由ulimit -a查看。
back_log = 500

# 指定大小的内存来缓冲数据和索引，对于单独的MySQL数据库服务器，最大可以把该值设置成物理内存的80%
# 根据MySQL手册，对于2G内存的机器，推荐值是1G（50%）
innodb_buffer_pool_size         = {{ (ansible_memory_mb['real']['total'] / 2) | int }}M

# 日志缓存的大小
# 默认的设置在中等强度写入负载以及较短事务的情况下，一般可以满足服务器的性能要求。
# 如果更新操作峰值或者负载较大就应该加大这个值。8-16M即可。
innodb_log_buffer_size          = 64M

# 如果设置为1，则每个事务提交的时候，MySQL都会将事务日志写入磁盘。
# 如果设置为0或者2，则大概每秒中将日志写入磁盘一次。
# 实际测试发现，该值对插入数据的速度影响非常大
# 设置为2时插入10000条记录只需要2秒，设置为0时只需要1秒，而设置为1时则需要229秒。
# 建议尽量将插入操作合并成一个事务，这样可以大幅提高速度。
# 在存在丢失最近部分事务的危险的前提下，可以把该值设为0。
innodb_flush_log_at_trx_commit  = 0

# 日志组中每个日志文件的大小在高写入负载尤其是大数据集的情况下很重要。
# 这个值越大性能就越高，但恢复时时间会加长。默认是5M。
innodb_log_file_size            = 512M
innodb_log_files_in_group       = 2

# InnoDB 用来刷新日志的方法.
# 表空间总是使用双重写入刷新方法
# 默认值是 "fdatasync", 另一个是 "O_DSYNC".
# 一般来说，如果你有硬件 RAID 控制器，并且其独立缓存采用 write-back 机制，并有着电池断电保护，那么应该设置配置为 O_DIRECT
# 否则，大多数情况下应将其设为 fdatasync
innodb_flush_method             = O_DIRECT

# 在 InnoDB 缓冲池中最大允许的脏页面的比例.
# 如果达到限额, InnoDB 会开始刷新他们防止他们妨碍到干净数据页面.
# 这是一个软限制,不被保证绝对执行.
# 当系统中脏页所占百分比超过这个值，INNODB就会进行写操作以把页中的已更新数据写入到磁盘文件中。
# 默认75，一般现在流行的SSD硬盘很难达到这个比例。可依据实际情况在75-80之间调节
innodb_max_dirty_pages_pct = 75

# InnoDB 使用后台线程处理数据页上写 I/O（输入）请求的线程数量
# 脏页写的线程数，加大该参数可以提升写入性能,默认值4
innodb_write_io_threads = 8

# InnoDB 使用后台线程处理数据页上读 I/O（输出）请求的线程数量
# 此参数可以在linux平台上可以根据CPU核数进一步更改来提高性能，读操作比较多可以提高read_io_threads数量。
# 可以通过show engine innodb status\G 在FILE I/O段查看到
innodb_read_io_threads = 8

# 指定是否要根据负荷动态地调整InnoDB缓冲池中的刷新垃圾页面率。动态地调整垃圾页面率是为了避免突发的I/O并发量。该设置默认为启用。
# innodb_adaptive_flushing = 0

# 从缓冲区刷新脏页时，一次刷新脏页的数量。根据磁盘IOPS的能力一般建议设置如下：
# SAS 200
# SSD 5000
# PCI-E 10000-50000
innodb_io_capacity = 3000

# 默认值为 1. 在SSD存储上应设置为0(禁用) ,因为使用顺序IO没有任何性能收益. 在使用RAID的某些硬件上也应该禁用此设置,因为逻辑上连续的块在物理磁盘上并不能保证也是连续的.
innodb_flush_neighbors = 0

# 在被回滚前,一个 InnoDB 的事务应该等待一个锁被批准多久.
# InnoDB 在其拥有的锁表中自动检测事务死锁并且回滚事务.
# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了 InnoDB 以外的其他事务安全的存储引擎
# 那么一个死锁可能发生而 InnoDB 无法注意到.
# 这种情况下这个 timeout 值对于解决这种问题就非常有帮助.
innodb_lock_wait_timeout = 120


# 产生的log以mysql-bin开头
log-bin                 = {{ data_dir }}/mysql-bin
relay_log               = mysql-relay-bin
binlog_format           = ROW

tmpdir                  = {{ tmp_dir }}


# 开启慢日志 1：开启 0：关闭
slow_query_log = 1

# 设置日志时长 单位（秒）
long_query_time = 0.5

# 慢日志路径
slow_query_log_file = /var/log/mysql/slow.log

log-error           = /var/log/mysql/error.log

# 在一个事务中 binlog 为了记录 SQL 状态所持有的 cache 大小
# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.
# 所有从事务来的状态都将被缓冲在 binlog 缓冲中然后在提交后一次性写入到 binlog 中
# 如果事务比此值大, 会使用磁盘上的临时文件来替代.
# 此缓冲在每个连接的事务第一次更新状态时被创建
binlog_cache_size = 4M

# 独立的内存表所允许的最大容量.
# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.
max_heap_table_size = 512M

# 随机读取数据缓冲区使用内存(read_rnd_buffer_size)：和顺序读取相对应，
# 当 MySQL 进行非顺序读取（随机读取）数据块的时候，会利用>这个缓冲区暂存读取的数据
# 如根据索引信息读取表数据，根据排序后的结果集与表进行 Join 等等
# 总的来说，就是当数据块的读取需要满足>一定的顺序的情况下，MySQL 就需要产生随机读取，进而使用到 read_rnd_buffer_size 参数所设置的内存缓冲区
read_rnd_buffer_size = 16M

# 排序缓冲被用来处理类似 ORDER BY 以及 GROUP BY 队列所引起的排序
# 如果排序后的数据无法放入排序缓冲,一个用来替代的基于磁盘的合并分类会被使用
# 查看 “Sort_merge_passes” 状态变量.
# 在排序发生时由每个线程分配
sort_buffer_size = 16M

# 此缓冲被使用来优化全联合(FULL JOINS 不带索引的联合).
# 类似的联合在极大多数情况下有非常糟糕的性能表现,但是将此值设大能够减轻性能影响.
# 通过 “Select_full_join” 状态变量查看全联合的数量
# 当全联合发生时,在每个线程中分配
join_buffer_size = 16M

# 我们在 cache 中保留多少线程用于重用
# 当一个客户端断开连接后,如果 cache 中的线程还少于 thread_cache_size,则客户端线程被放入cache 中.
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)
# 可以复用的保存在线程缓存中的线程的数量.内存G*8即2G设为16
# 服务器线程缓存这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,
# 那么客户端的线程将被放到缓存中,如果线程重新被请求，那么请求将从缓存中读取,如果缓存中是空的或者是新的请求，
# 那么这个线程将被重新创建,如果有很多新的线程，增加这个值可以改善系统性能.
# 通过比较 Connections 和 Threads_created 状态的变量，可以看到这个变量的作用。
# 设置规则如下：1GB 内存配置为8，2GB配置为16，3GB配置为32，4GB或更高内存，可配置更大。
thread_cache_size = 64

# 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.
# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).
# 你可可以尝试使用 [CPU数量]*(2..4) 来作为 thread_concurrency 的值
#thread_concurrency = 8

# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.
# 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高.
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,
# 查询缓冲也许引起性能下降而不是性能提升.
query_cache_size = 128M

# 只有小于此设定值的结果才会被缓冲
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.
query_cache_limit = 4M

# 被全文检索索引的最小的字长.
# 你也许希望减少它,如果你需要搜索更短字的时候.
# 注意在你修改此值之后,你需要重建你的 FULLTEXT 索引
ft_min_word_len = 8

# 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的 mysql 在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被 swapping out
# 此选项对于性能有益
#memlock

# 当创建新表时作为默认使用的表类型,
# 如果在创建表示没有特别执行表类型,将会使用此值
# default_table_type = InnoDB

# 线程使用的堆大小. 此容量的内存在每次连接时被预留.
# MySQL 本身常不会需要超过 64K 的内存
# 如果你使用你自己的需要大量堆的 UDF 函数或者你的操作系统对于某些操作需要更多的堆,你也许需要将其设置的更高一点.
thread_stack = 512K

# 设定默认的事务隔离级别.可用的级别如下:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = REPEATABLE-READ

# 内部(内存中)临时表的最大大小
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.
# 此限制是针对单个表的,而不是总和.
tmp_table_size = 512M

#*** MyISAM 相关选项

# 关键词缓冲的大小, 一般用来缓冲 MyISAM 表的索引块.
# 不要将其设置大于你可用内存的30%,
# 因为一部分内存同样被OS用来缓冲行数据
# 甚至在你并不使用 MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.
key_buffer_size = 128M

# 用来做 MyISAM 表全表扫描的缓冲大小.
# 当全表扫描需要时,在对应线程中分配.
read_buffer_size = 8M

# 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.
# 如果你增高此值,可以提高很多 ORDER BY 的性能.
# 当需要时由每个线程分配
read_rnd_buffer_size = 64M

# MyISAM 使用特殊的类似树的 cache 来使得突发插入
# (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA INFILE) 更快.
# 此变量限制每个进程中缓冲树的字节数.
# 设置为 0 会关闭此优化.
# 为了最优化不要将此值设置大于 “key_buffer_size”.
# 当突发插入被检测到时此缓冲将被分配.
bulk_insert_buffer_size = 128M

# 此缓冲当 MySQL 需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.
# 这在每个线程中被分配.所以在设置大值时需要小心.
myisam_sort_buffer_size = 256M

# MySQL 重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)
myisam_max_sort_file_size = 10G

# 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.
# 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.
#myisam_max_extra_sort_file_size = 10G

# 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.
# 这对于拥有多个 CPU 以及大量内存情况的用户,是一个很好的选择.
myisam_repair_threads = 1

# 自动检查和修复没有适当关闭的 MyISAM 表.
#myisam_recover

# 默认关闭 Federated
skip-federated


[client]
default-character-set = utf8mb4
socket=/tmp/mysql.sock

[mysql]
socket=/tmp/mysql.sock
default-character-set = utf8mb4
